<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');
require_once ('./application/controllers/authenticate.php');

class Admin extends Authenticate {

    const ADMIN_PER_PAGE = 100;
    const ADMIN_PAGE_RANGE = 5;

    function __construct() {
        global $active_system_function;
        $active_system_function = 'admin/site/admin/index';
        parent::__construct();
        $this->load->model('admin_model');
        $this->load->model('site_role_model');
        $this->load->model('cms_category_model');
        $this->load->library('upload');
    }

    protected function _eventLoadLayout() {
        $this->page['title'] = 'Quản lý người dùng';
        $this->module['title'] = 'Quản lý người dùng';
    }

    function index() {
        try {
            $data = $this->_initData();
            $data['mode'] = 'grid';
            $this->setPageContent('admin/site/admin/grid', $data);
            $this->renderLayout('layouts/fullcolumn');
        } catch (Exception $ex) {
            echo $ex->getMessage();
        }
    }

    protected function _initData() {
        $data['collection'] = $this->admin_model->get_users();
        $data['roles'] = $this->site_role_model->get_roles();
        $data['save_action'] = site_url('admin/site/admin/save', true);
        return $data;
    }

    function check_system($id) {
        $admin = new admin_model();
        $admin = $admin->load_by_id($id);
        // Check System Role
        if (intval($admin->is_system) == 1) {
            $this->st_registry->register('admin/site/admin/error', 'Không thể sửa đổi thông tin hệ thống');
            redirect(site_url('admin/site/admin/index', true));
            exit();
        }
    }

    function save() {
        try {
            $id = $this->input->post('id');
            $data = $this->input->post('data');
            $data['username'] = trim($data['username']);
            $data['email'] = trim($data['email']);
            if ($this->admin_model->exist_username($data['username'])) {
                $this->st_registry->register('admin/site/admin/error', 'Đã tồn tại người dùng có tên đăng nhập: ' . $data['username']);
                redirect(site_url('admin/site/admin/index', true));
                exit();
            }
            if ($this->admin_model->exist_email($data['email'])) {
                $this->st_registry->register('admin/site/admin/error', 'Đã tồn tại người dùng sử dụng email: ' . $data['email']);
                redirect(site_url('admin/site/admin/index', true));
                exit();
            }
            if (isset($data['password'])) {
                $data['password'] = trim($data['password']);
            }
            if (empty($data['password'])) {
                unset($data['password']);
            } else {
                $data['password'] = md5($data['password']);
            }
            if (empty($id)) {
                $id = $this->admin_model->add_admin($data);
                $this->st_registry->register('admin/site/admin/success', 'Thêm mới người dùng thành công');
            } else {
                $this->check_system($id);
                $this->admin_model->update_admin($id, $data);
                $this->st_registry->register('admin/site/admin/success', 'Cập nhật thông tin người dùng thành công');
            }            
        } catch (Exception $ex) {
            $this->st_registry->register('admin/site/admin/error', 'Lỗi xảy ra: ' . $ex->getMessage());
        }
        redirect(site_url('admin/site/admin/index', true));
    }

    function ajax_edit() {
        try {
            $id = $this->input->getParam('id');
            if (empty($id)) {
                throw new Exception('Không tìm thấy người dùng theo ID');
                exit();
            }
            $data['admin'] = $this->admin_model->load_by_id($id);
            $data['roles'] = $this->site_role_model->get_roles();
            $data['save_action'] = site_url('admin/site/admin/save', true);
            $data['mode'] = 'ajax_edit';
            $this->setPageContent('admin/site/admin/ajax/edit', $data);
            $this->renderLayout('layouts/ajax');
        } catch (Exception $ex) {
            $this->st_registry->register('admin/site/admin/error', 'Lỗi xảy ra: ' . $ex->getMessage());
        }
    }

    function ajax_filter() {
        $filters = $this->input->post('filters');
        $conds = null;
        // Init Filters
        if (!isset($filters['a.id'])) {
            $filters['a.id']['type'] = 'equal';
            $filters['a.id']['value'] = null;
        }
        if (!isset($filters['a.name'])) {
            $filters['a.name']['type'] = 'text';
            $filters['a.name']['value'] = null;
        }
        if (!isset($filters['is_active'])) {
            $filters['is_active']['type'] = 'equal';
            $filters['is_active']['value'] = null;
        }
        if ($filters) {
            $conds = analyze_filters($filters);
        }
        $data['filters'] = $filters;
        $data['collection'] = $this->admin_model->get_collection(0, 0, $conds, null);
        $this->setPageContent('admin/site/admin/ajax/grid', $data);
        $this->renderLayout('layouts/ajax');
        return $data;
    }

    function edit() {
        try {
            $id = $this->input->getParam('id');
            if (empty($id)) {
                throw new Exception('Không xác định được người dùng cần sửa đổi thông tin');
                exit();
            }
            $data = $this->_initData();
            $data['admin'] = $this->admin_model->load_by_id($id);
            $data['categories'] = $this->cms_category_model->get_list();
            $data['roles'] = $this->site_role_model->get_roles();
            $data['mode'] = 'edit';
            $this->setPageContent('admin/site/admin/grid', $data);
            $this->renderLayout('layouts/fullcolumn');
        } catch (Exception $ex) {
            $this->st_registry->register('admin/site/admin/error', 'Lỗi xảy ra: ' . $ex->getMessage());
        }
    }

    function delete() {
        try {
            $id = $this->input->getParam('id');
            if (empty($id)) {
                $this->st_registry->register('admin/site/admin/error', 'Không xác định được người dùng cần xóa (ID)?');
                redirect(site_url('admin/site/admin/index', true));
                exit();
            }
            $this->check_system($id);
            $this->admin_model->delete_admin($id);
            $this->st_registry->register('admin/site/admin/success', 'Xóa người dùng thành công');
        } catch (Exception $ex) {
            $this->st_registry->register('admin/site/admin/error', 'Lỗi xảy ra: ' . $ex->getMessage());
        }
        redirect(site_url('admin/site/admin/index', true));
    }

    function config() {
        try {
            global $active_system_function;
            $active_system_function = 'admin/site/admin/config';
            $this->load->model('site_config_model');
            $this->page['title'] = 'Thông tin cấu hình';
            $this->module['title'] = 'Thông tin cấu hình';
            $data['mode'] = 'edit';
            $data['config'] = $this->site_config_model->get_config();
            $data['save_action'] = site_url('admin/site/admin/save_config', true);
            $this->setPageContent('admin/site/admin/config', $data);
            $this->renderLayout('layouts/fullcolumn');
        } catch (Exception $ex) {
            $this->st_registry->register('admin/site/admin/error', 'Lỗi xảy ra: ' . $ex->getMessage());
        }
    }

    function profile() {
        try {
            global $active_system_function;
            $active_system_function = 'admin/site/admin/profile';
            $this->page['title'] = 'Thay đổi thông tin tài khoản';
            $this->module['title'] = 'Thay đổi thông tin tài khoản';
            $return = $this->input->getParam('return');
            if ($return == 'password') {
                $data['change_password'] = true;
            }
            $data['admin'] = $this->admin_model->get_admin();
            $data['save_action'] = site_url('admin/site/admin/save_profile', true);
            $data['change_password_action'] = site_url('admin/site/admin/change_password', true);
            $this->setPageContent('admin/site/admin/profile', $data);
            $this->renderLayout('layouts/fullcolumn');
        } catch (Exception $ex) {
            $this->st_registry->register('admin/site/admin/error', 'Lỗi xảy ra: ' . $ex->getMessage());
        }
    }

    function save_config() {
        try {
            $this->load->model('site_config_model');
            $data = $this->input->post('data');
            $set_logo_url = $this->input->post('set_logo_url');
            $logo_path = $this->input->post('logo_path');
            // Config Upload
            $config['allowed_types'] = 'gif|jpg|png|bmp|psd';
            $config['max_size'] = '500';
            $config['file_name'] = 'logo';
            $skin = './' . SKIN;
            $config['upload_path'] = $skin . 'images/';
            if (!file_exists($config['upload_path'])) {
                mkdir($config['upload_path'], 0777, true);
            }
            $old_logo = $this->site_config_model->get_logo_path();
            if (isset($_FILES['data_logo']) && $_FILES['data_logo']['size'] > 0) {
                @unlink($old_logo);
                if ($set_logo_url) {
                    if (!empty($logo_path)) {
                        $data['logo'] = $logo_path;
                    }
                } else {
                    $this->upload->initialize($config);
                    $this->upload->do_upload('data_logo');
                    // Render Image Path
                    $data_upload = $this->upload->data();
                    $logo_path = $config['upload_path'] . $data_upload['file_name'];
                    if (strlen($data_upload['file_name']) > 0) {
                        $data['logo'] = $logo_path;
                    }
                }
            } else {
                if ($set_logo_url) {
                    if (!empty($logo_path)) {
                        $data['logo'] = $logo_path;
                    }
                } else {
                    $data['logo'] = $old_logo;
                }
            }
            $this->site_config_model->save_config($data);
            $this->st_registry->register('admin/site/admin/success', 'Lưu thông tin cấu hình thành công');
            redirect(site_url('admin/site/admin/config', true));
        } catch (Exception $ex) {
            $this->st_registry->register('admin/site/admin/error', 'Lỗi xảy ra: ' . $ex->getMessage());
        }
    }

    function save_profile() {
        try {
            $data = $this->input->post('data');
            $id = $this->admin_model->get_id();
            if (empty($id)) {
                $this->st_registry->register('admin/site/admin/error', 'Không tìm thấy thông tin tài khoản');
                redirect(site_url('admin/site/admin/profile', true));
                exit();
            }
            $this->admin_model->update_admin($id, $data);
            $admin = $this->admin_model->load_by_id($id);
            $logged_data = array('admin' => $admin);
            $this->session->set_userdata($logged_data);
            $this->st_registry->register('admin/site/admin/success', 'Thông tin tài khoản đã được cập nhật');
            redirect(site_url('admin/site/admin/profile', true));
        } catch (Exception $ex) {
            $this->st_registry->register('admin/site/admin/error', 'Lỗi xảy ra: ' . $ex->getMessage());
        }
    }

    function change_password() {
        try {
            $data = $this->input->post('data');
            if (empty($data['current_password'])) {
                $this->st_registry->register('admin/site/admin/error', 'Bạn chưa nhập mật khẩu hiện tại');
                redirect(site_url('admin/site/admin/profile/return/password', true));
                exit();
            }
            if (empty($data['password'])) {
                $this->st_registry->register('admin/site/admin/error', 'Bạn chưa nhập mật khẩu mới');
                redirect(site_url('admin/site/admin/profile/return/password', true));
                exit();
            }
            if (empty($data['confirm_password'])) {
                $this->st_registry->register('admin/site/admin/error', 'Bạn chưa xác nhận mật khẩu');
                redirect(site_url('admin/site/admin/profile/return/password', true));
                exit();
            }
            $id = $this->admin_model->get_id();
            $matched_password = $this->admin_model->get_password($id);
            if ($matched_password != md5($data['current_password'])) {
                $this->st_registry->register('admin/site/admin/error', 'Xác nhận mật khẩu hiện tại sai');
                redirect(site_url('admin/site/admin/profile/return/password', true));
                exit();
            }
            if ($data['password'] != $data['confirm_password']) {
                $this->st_registry->register('admin/site/admin/error', 'Xác nhận mật khẩu sai');
                redirect(site_url('admin/site/admin/profile/return/password', true));
                exit();
            }
            if (empty($id)) {
                $this->st_registry->register('admin/site/admin/error', 'Không tìm thấy thông tin tài khoản');
                redirect(site_url('admin/site/admin/profile/return/password', true));
                exit();
            }
            $this->admin_model->update_admin($id, $data);
            $admin = $this->admin_model->load_by_id($id);
            $logged_data = array('admin' => $admin);
            $this->session->set_userdata($logged_data);
            $this->st_registry->register('admin/site/admin/success', 'Thông tin tài khoản đã được cập nhật');
            redirect(site_url('admin/site/admin/profile/return/password', true));
        } catch (Exception $ex) {
            $this->st_registry->register('admin/site/admin/error', 'Lỗi xảy ra: ' . $ex->getMessage());
        }
    }
}